/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "大纲工作区.h"

#include "ui大纲视图.h"
#include "框架/工作区/通用弹出菜单.h"
#include "A_引擎/文件工程/配置.h"

#include "框架/工作区/3D工作区/ui3D场景视口.h"



static std::set<C_工作区页面*> g_大纲视图页面;
static C_Widget* g大纲视图_删除菜单;



//static bool on_大纲视图打开(C_Widget* self, bool show) {
//	C_工作区页面* 工作区 = dynamic_cast<C_工作区页面*>(self);
//	工作区->m_更新绘制属性 = true;
//	工作区->mui_视口页面->m_更新绘制属性 = true;
//	return false;
//}


static void on_添加渲染世界(S_Props& prop) {
	C_工作区页面*	page = static_cast<C_工作区页面*>(prop.m_UI->m_部件->m_父部件->m_父部件);
	C_大纲视图*		view = static_cast<C_大纲视图*>((page->mui_视口页面));

	auto* 渲染世界 = f_node_创建渲染世界(u"渲染世界", *S_节点框架::g_3D视口环境);
	S_Object* item = f_node_创建渲染层(渲染世界, u"新渲染层", *S_节点框架::g_3D视口环境);
	渲染世界->m_是否展开 = true;
	item->m_是否展开 = true;

	f_world_添加渲染层((S_渲染世界*)渲染世界->m_UserData, (S_渲染层*)item->m_UserData, item->m_ID);

	view->m_更新绘制属性 = true;
}
static void on_删除渲染世界(S_Props& prop) {
	C_工作区页面* page = static_cast<C_工作区页面*>(prop.m_UI->m_部件->m_父部件->m_父部件);
	C_大纲视图* view = static_cast<C_大纲视图*>((page->mui_视口页面));

	auto obs = f_ui_树形框_取选择项(view->f_get子组件(0));
	for (auto& e : obs) {
		f_node_删除渲染世界(e->m_Name);
	}
	view->m_更新绘制属性 = true;
}



void on_大纲切换(S_Props& prop) {
	C_工作区页面*	page = static_cast<C_工作区页面*>(prop.m_UI->m_部件->m_父部件->m_父部件);
	C_大纲视图*		view = static_cast<C_大纲视图*>((page->mui_视口页面));

	switch (f_prop_enum(prop)) {
		case 0: {
			f_ui_树形框_绑定回调函数(view->f_get子组件(0), f_global_大纲数据(), on_计算树形框项显示层级, on_树形框创建项附件组件);
			break;
		}
		case 1: {
			break;
		}
		case 2: {
			f_ui_树形框_绑定回调函数(view->f_get子组件(0), S_节点数据::g_渲染层大纲数据, on_计算树形框项显示层级, on_树形框_渲染层_创建项附件组件);
			break;
		}
		case 3: {
			f_ui_树形框_绑定回调函数(view->f_get子组件(0), &(*S_框架::g_场景节点), on_计算树形框项显示层级, on_大纲视图_创建项附件组件_场景节点树);
			break;
		}
		default:
			break;
	}

	f_工作区_重构大纲视图状态条(view);
}



void f_工作区页面_大纲视图初始化(S_UI渲染环境& ctx) {
	g大纲视图_删除菜单 = f_通用菜单_节点删除菜单(ctx, on_大纲视图_删除渲染世界);
}


static void f_大纲视图_大纲视图布局(C_Widget* self, C_Widget** w, uint32 num) {
	
	auto& view = *w[0];
	view.f_setW(self->m_Size.x);
	float32 内部高度 = f_ui_树形框_构建区域项显示(w[0]);

}

static void f_大纲视图绘制(C_Widget* self, S_2D画布* 画布) {
	C_大纲视图& box = *dynamic_cast<C_大纲视图*>(self);
	box.m_背景 = f_vg_genConvex((*self), *画布, E_填充模式::e_填充面, E_图层混合模式::e_Normal);

}

static bool on_大纲视图打开关闭(C_Widget* self, bool show) {
	C_工作区页面* 工作区 = dynamic_cast<C_工作区页面*>(self);
	C_大纲视图* view = dynamic_cast<C_大纲视图*>(工作区->mui_视口页面);

	f_页面_渲染层配置(工作区, show);

	return false;
}



C_工作区页面* f_工作区_创建大纲视图(S_UI渲染环境& ctx) {
	auto* view = f_大纲视图_创建(ctx);

	C_工作区页面* 工作区 = new C_工作区页面(
		E_工作区类型::e_大纲视口,
		ctx,
		E_方向::e_横向,
		view,
		view->m_状态条,
		view->m_属性栏);

	工作区->mf_打开关闭 = on_大纲视图打开关闭;

	g_大纲视图页面.insert(工作区);

	f_工作区_重构大纲视图状态条(view);

	f_页面_渲染层配置(工作区, true);


	S_键盘键位映射* 快捷键;
	快捷键 = f_widget_init_键盘位映射();
	快捷键->event = f_大纲视图工作区_删除渲染层项;
	快捷键->键盘按键[0] = S_InputKey::e_KEY_X;
	快捷键->键盘状态[0] = DEF_按键状态_放开;
	快捷键->发生组件 = view;
	C_键位映射配置::f_添加大纲视口操作键位(view, (S_键位映射*)快捷键, u"删除渲染层", u"删除");

	快捷键 = f_widget_init_键盘位映射();
	快捷键->event = f_大纲视图工作区_开启区间选择;
	快捷键->键盘按键[0] = S_InputKey::e_KEY_左SHIFT;
	快捷键->键盘状态[0] = DEF_按键状态_按下 | DEF_按键状态_按下中;
	快捷键->发生组件 = view;
	C_键位映射配置::f_添加大纲视口操作键位(view, (S_键位映射*)快捷键, u"开启区间选择", u"开启区间选择");

	//快捷键 = f_widget_init_键盘位映射();
	//快捷键->event = f_大纲视图工作区_关闭区间选择;
	//快捷键->键盘按键[0] = S_InputKey::e_KEY_左SHIFT;
	//快捷键->键盘状态[0] = DEF_按键状态_放开;
	//快捷键->发生组件 = view;
	//C_键位映射配置::f_添加大纲视口操作键位(view, (S_键位映射*)快捷键, u"关闭区间选择", u"关闭区间选择");

	f_ui_整理快捷键(view);
	return 工作区;
}

void f_工作区_销毁大纲视图(C_工作区页面* page) {
	g_大纲视图页面.erase(page);
	delete page;
}

void f_打开大纲视口说明(S_Props& prop) {

}

void f_工作区_重构大纲视图状态条(C_Widget* view) {
	std::vector<S_Props> props;

	C_大纲视图* box = static_cast<C_大纲视图*>(view);

	//auto prop = f_alloc_OpsProp(f_打开大纲视口说明, u"场景视口说明", u"疑问");
	//prop.m_风格属性->m_图元形状 = &view->m_UIctx->m_Ctx.m_几何图形->m_平面圆形;
	//prop.m_布局方式 = E_布局方式::e_等比;
	//props.push_back(prop);

	props.push_back(f_alloc_NoneProp());
	
	auto 分区 = f_alloc_EnumProp(&box->m_当前视图内容, {
		{u"场景",		u"加载物体"},
		{u"动态创建",	u"物体"},
		{u"渲染层",		u"layers_1"},
		{u"节点",		u"节点"},
	}, u"分区");
	分区.m_UI->m_Update = on_大纲切换;
	props.push_back(分区);

	switch (box->m_当前视图内容) {
		case 0: {
			break;
		}
		case 2: {
			props.push_back(f_alloc_NoneProp());
			auto 添加渲染层 = f_alloc_OpsProp(on_添加渲染世界, u"添加渲染世界");
			props.push_back(添加渲染层);
			auto 删除渲染层 = f_alloc_OpsProp(on_删除渲染世界, u"删除渲染世界");
			props.push_back(删除渲染层);
			break;
		}
		case 3: {
			
			break;
		}
		default:
			break;
	}
	
	props.push_back(f_alloc_NoneProp());
	
	box->m_状态条->f_构建属性部件(props, nullptr);
}




void f_大纲视图页面_联动更新(E_工作区类型 来源工作区类型, E_工作区操作类型 操作类型) {
	switch (操作类型) {
		case e_创建节点:
		case e_删除节点:
			break;

		case e_创建物体:
		case e_删除物体:
		case e_拾取物体: {
			std::vector<S_Object*> item(S_框架::g_拾取物体.begin(), S_框架::g_拾取物体.end());

			for (auto& e : C_大纲视图::g大纲视图) {
				auto* w = e->f_get子组件(0);
				f_ui_树形框_设置选择项(w, item.data(), item.size());
				f_widget_更新绘制(e);
			}
			
			break;
		}

		case E_工作区操作类型::e_变换物体: {
			for (auto& e : C_大纲视图::g大纲视图) {
				f_widget_更新渲染层(e);
			}
			break;
		}
		default:
			break;
	}

	//f_大纲视图页面_更新大纲绘制();
}

void f_大纲视图工作区_销毁() {
	for (auto& e : g_大纲视图页面) {
		//f_工作区_销毁大纲视图(e);
		on_大纲视图打开关闭(e, false);
	}
	//for (auto& e : C_大纲视图::g大纲视图) {
	//	on_大纲视图打开关闭(e, false);
	//}

	C_大纲视图::g大纲视图.clear();
	g_大纲视图页面.clear();

	f_global_清除大纲数据();
}

void f_大纲视图页面_刷新大纲绘制() {
	for (auto& e : C_大纲视图::g大纲视图) {
		if (e->m_显示) {
			f_widget_更新绘制(e->m_父部件);
			//f_widget_更新渲染层(e);
		}
	}
}

void f_大纲视图页面_重构大纲绘制() {
	for (auto& e : C_大纲视图::g大纲视图) {
		if (e->m_显示) {
			f_ui_树形框_构建区域项显示(e->m_树形框);
		}
	}
}

void f_大纲视图工作区_保存工作区状态(FILE* f, C_工作区页面* 页面) {
	auto 文件块 = f_文件块_创建(E_节点工程文件块类型::e_工程文件块_大纲视口工作区状态, S_引擎配置::g_文件版本号);
	S_UI8Array* 块 = (S_UI8Array*)f_core_array_new(0, sizeof(uint8));

	C_大纲视图* view = dynamic_cast<C_大纲视图*>(页面->mui_视口页面);
	f_文件块_写数据块(块, view->m_当前视图内容);
	f_文件块_写数据块(块, view->m_树形框->m_Pos.y);
	//f_prop_Save(view->m_当前视图内容, 块);

	f_file_保存文件块(f, 文件块, 块);
}

void f_大纲视图工作区_加载工作区状态(FILE* f, C_工作区页面* 页面) {
	S_文件块 文件块 = f_file_读取文件块(f);

	C_大纲视图* view = dynamic_cast<C_大纲视图*>(页面->mui_视口页面);

	if (文件块.m_块类型 == E_节点工程文件块类型::e_工程文件块_大纲视口工作区状态) {
		const uint8* 下一次读取数据指针 = 文件块.m_data;
		if (f_file_版本对比(文件块, S_引擎配置::g_低版本号_0, S_引擎配置::g_文件版本号)) {
			下一次读取数据指针 = f_文件块_读数据块(下一次读取数据指针, view->m_当前视图内容);
			下一次读取数据指针 = f_文件块_读数据块(下一次读取数据指针, view->m_树形框->m_Pos.y);
		}
		//下一次读取数据指针 = f_prop_Load(m_计算类型, 下一次读取数据指针);
	}
	free(文件块.m_data);
}

void f_大纲视图工作区_清除所有项() {
	//std::set<C_Widget*> 树形框;
	for (auto& e : C_大纲视图::g大纲视图) {
		//树形框.insert(e->f_get子组件(0));
		f_ui_树形框_清除(e->f_get子组件(0));
		f_widget_更新绘制(e);
	}

	f_global_大纲数据()->m_子物体.clear();
	//f_ui_树形框_清除(树形框);
}










E_事件是否传递 f_大纲视图工作区_删除渲染层项(C_Widget* self, E_键位执行状态 状态) {
	f_ui_打开弹出窗口(g大纲视图_删除菜单, C_Widget::g_鼠标.gPos, self);
	return E_事件是否传递::e_事件传递_终止;
}

E_事件是否传递 f_大纲视图工作区_开启区间选择(C_Widget* self, E_键位执行状态 状态) {
	if (E_键位执行状态::e_完成 == 状态) {
		f_ui_树形框_关闭项选择清除(self->f_get子组件(0), false);
	}
	else {
		f_ui_树形框_关闭项选择清除(self->f_get子组件(0), true);
	}
	return E_事件是否传递::e_事件传递_终止;
}



